package com.jhy.suixianglu.daima20230207;

import java.util.Stack;

/**
 * 给你一个字符串数组 tokens ，表示一个根据 逆波兰表示法 表示的算术表达式。
 * <p>
 * 请你计算该表达式。返回一个表示表达式值的整数。
 * <p>
 * 注意：
 * <p>
 * 有效的算符为 '+'、'-'、'*' 和 '/' 。
 * 每个操作数（运算对象）都可以是一个整数或者另一个表达式。
 * 两个整数之间的除法总是 向零截断 。
 * 表达式中不含除零运算。
 * 输入是一个根据逆波兰表示法表示的算术表达式。
 * 答案及所有中间计算结果可以用 32 位 整数表示。
 * <p>
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode.cn/problems/evaluate-reverse-polish-notation
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
public class EvalRPN {
    public int evalRPN(String[] tokens) {
        Stack<Integer> stack = new Stack<>();
        for (int i = 0; i < tokens.length; i++) {
            if ("+".equals(tokens[i]) || "-".equals(tokens[i]) ||
                    "*".equals(tokens[i]) || "/".equals(tokens[i])) {
                int num1 = stack.pop();
                int num2 = stack.pop();
                if ("+".equals(tokens[i])) {
                    stack.push(num1 + num2);
                }
                if("-".equals(tokens[i])){
                    // 这个也要特殊处理
                    stack.push(-num1+num2);
                }
                if("*".equals(tokens[i])){
                    stack.push(num1*num2);
                }
                // 这个需要特殊处理 因为 num2要大一点
                if("/".equals(tokens[i])){
                    stack.push(num2/num1);
                }
            } else {
                stack.push(Integer.valueOf(tokens[i]));
            }
        }
        return stack.pop();
    }
}
